package cn.iocoder.yudao.module.infra.tts.impl.minimax.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class MinimaxTTSReq {
    /**
     * 【必填】请求的模型版本
     * 可选值: speech-02-hd, speech-02-turbo, speech-01-hd, speech-01-turbo,
     * speech-01-240228, speech-01-turbo-240228
     */
    @JsonProperty("model")
    private String model;

    /**
     * 【必填】待合成的文本
     * - 长度限制: <10000字符
     * - 段落切换用换行符
     * - 控制语音间隔: 在字间增加<#x#>,x为秒数(0.01-99.99,两位小数)
     * - 注意: 间隔需设置在可发音文本之间,不能连续多个间隔
     */
    @JsonProperty("text")
    private String text;

    /**
     * 是否流式输出，默认false(不开启流式)
     */
    @JsonProperty("stream")
    private Boolean stream = false;

    /**
     * 语言增强设置(默认null)
     * 可选值: 'Chinese', 'Chinese,Yue', 'English', 'Arabic'等
     * 或设为'auto'由模型自动判断
     */
    @JsonProperty("language_boost")
    private String language_boost;

    /**
     * 输出格式(非流式场景有效)
     * 可选值: url, hex(默认)
     */
    @JsonProperty("output_format")
    private String output_format;

    /**
     * 语音设置参数
     */
    @JsonProperty("voice_setting")
    private VoiceSetting voice_setting;

    /**
     * 音频设置参数
     */
    @JsonProperty("audio_setting")
    private AudioSetting audio_setting;

    /**
     * 是否开启字幕服务(默认false)
     * 仅对speech-01-turbo和speech-01-hd有效
     */
    @JsonProperty("subtitle_enable")
    private Boolean subtitle_enable = false;

    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public static class VoiceSetting {
        /**
         * 音色ID(与timber_weights二选一必填)
         */
        @JsonProperty("voice_id")
        private String voice_id;

        /**
         * 语速
         */
        @JsonProperty("speed")
        private Double speed;

        /**
         * 音量
         */
        @JsonProperty("vol")
        private Double vol;

        /**
         * 音高
         */
        @JsonProperty("pitch")
        private Double pitch;

        /**
         * 情感
         */
        @JsonProperty("emotion")
        private String emotion;
    }

    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public static class AudioSetting {
        /**
         * 采样率
         */
        @JsonProperty("sample_rate")
        private Integer sample_rate;

        /**
         * 比特率
         */
        @JsonProperty("bitrate")
        private Integer bitrate;

        /**
         * 格式
         */
        @JsonProperty("format")
        private String format;
    }
}